事前提要:
本 API 係為 永豐金 PYTHON API,尚未申請的朋友們,有兩個方法可以申請
假如沒有永豐證券帳號的朋友,首先要先去官網申請永豐證券帳號,審核通過之後在進行永豐API的申請喔
小聲說,沒有永豐金銀行戶頭的可以先申請DAWHO數位帳戶,比起大多數銀行提供的證券戶比起來,利息給的不錯(1.1%),有DAWHO數位帳戶之後在申請大戶投即可
簡易流程為
以上過程皆為線上操作,真的蠻方便的,這裡提供官方的教學文件
正文開始:
根據官方網站提供的介紹
首先要先輸入證券帳號密碼
import shioaji as sj
api = sj.Shioaji()
accounts = api.login("YOUR_PERSON_ID", "YOUR_PASSWORD")
api.activate_ca(
ca_path="/c/your/ca/path/Sinopac.pfx",
ca_passwd="YOUR_CA_PASSWORD",
person_id="Person of this Ca",
)
此API有提供股票、期貨與選擇權的合約可供查察
股票合約
金融市場最基礎的金融商品,簡單來說就是有上市上櫃的股份有限公司的股票,買了股票你就成為了公司股東,所以說買了自己公司的股票,你就成為了你老闆的老闆,是不是好棒棒呢?!
contract_2890 = api.Contracts.Stocks["2890"]
contract_2890
Stock(exchange=<Exchange.TSE: 'TSE'>, code='2890', symbol='TSE2890', name='永豐金', category='17', limit_up=11.3, limit_down=9.27, update_date='2020/03/18', day_trade=<DayTrade.Yes: 'Yes'>)
期貨合約
期貨合約,簡稱期貨,是一種跨越時間的交易方式。買賣雙方透過簽訂合約,同意按指定的時間、價格與其他交易條件,交收指定數量的現貨。通常期貨集中在期貨交易所,以標準化合約進行買賣,但亦有部分期貨合約可透過櫃台交易進行買賣,稱為場外交易合約。交易的資產通常是財貨或金融工具。雙方同意購買和出售資產的預定價格被稱為遠期價格。
contract_txf = api.Contracts.Futures['TXFC0']
contract_txf = api.Contracts.Futures.TXF.TXF202003
contract_txf
Future(code='TXFC0', symbol='TXF202003', name='臺股期貨', category='TXF', delivery_month='202003', underlying_kind='I', limit_up=10308.0, limit_down=8434.0, update_date='2020/03/18')
選擇權合約
選擇權是一種契約,其買方有權利但沒有義務,在未來的特定日期或之前,以特定的價格購買或出售一定數量的標的物。選擇權所表彰的是一種權利,選擇權買方支付權利金,取得買權CALL 或賣權PUT,於特定期間內,依特定價格及數量等交易條件買賣現貨之契約;選擇權之賣方,於買方要求履約時,有依選擇權約定履行契約之義務。
api.Contracts.Options["TXO10000C0"]
Option(code='TXO10000C0', symbol='TXO202003010000C', name='臺指選擇權', category='TXO', delivery_month='202003', strike_price=10000.0, option_right=<OptionRight.Call: 'C'>, underlying_kind='I', limit_up=945.0, limit_down=0.1, update_date='2020/03/18')
台灣加權指數合約
api.Contracts.Indexs.TSE.TSE001
Index(exchange=<Exchange.TSE: 'TSE'>, code='001', symbol='TSE001', name='加權')
接下來就可以接取股票或期貨合約的明細
永豐 API 提供了 Streaming 與 Historical 的資料,Streaming為即時資料
比如說想看護國神山台積電的逐筆 tick
api.quote.subscribe(api.Contracts.Stocks["2330"],
quote_type = sj.constant.QuoteType.Tick, # or 'tick'
version = sj.constant.QuoteVersion.v1 # or 'v1'
)
# v0 舊版本回傳的資料為
Response Code: 200 | Event Code: 16 | Info: MKT/*/TSE/2330 | Event: Subscribe or Unsubscribe ok
MKT/idcdmzpcr01/TSE/2330
{
'AmountSum': [1688787000.0], # 成交值
'Close': [593.0], # 收盤價
'Date': '2021/07/01', # 日期
'TickType': [2], # tick 種類,1 外盤成交,2 內盤成交,0 不能判斷
'Time': '09:10:20.628620', # 時間
'VolSum': [2837], # 成交總量
'Volume': [1] # 成交量
}
# v1 新版本加了很多東西
Response Code: 200 | Event Code: 16 | Info: TIC/v1/STK/*/TSE/2330 | Event: Subscribe or Unsubscribe ok
Exchange.TSE
Tick(
code = '2330',
datetime = datetime.datetime(2021, 7, 2, 13, 16, 35, 92970),
open = Decimal('590'),
avg_price = Decimal('589.05'),
close = Decimal('590'),
high = Decimal('593'),
low = Decimal('587'),
amount = Decimal('590000'),
total_amount = Decimal('8540101000'),
volume = 1,
total_volume = 14498,
tick_type = 1, #內外盤別 {1: buy deal, 2: sell deal, 0: can't judge}
chg_type = 4, # 漲跌註記 {1: limit up, 2: up, 3: unchanged, 4: down, 5: limit down}
price_chg = Decimal('-3'), # price change, 漲跌價差
pct_chg = Decimal('-0.505902'), # percentage change (%), 漲跌程度 %
bid_side_total_vol= 6638, # total buy deal volume (K shares, 買盤成交總量)
ask_side_total_vol = 7860, # total sell deal volume (K shares, 賣盤成交總量)
bid_side_total_cnt = 2694, # total number of buy deal (買盤成交筆數)
ask_side_total_cnt = 2705, # total number of sell deal (賣盤成交筆數)
closing_oddlot_shares = 0, # 盤後零股成交股數
fixed_trade_vol = 0, # 定盤成交量
suspend = 0, # 暫停交易
simtrade = 0, # 試撮
intraday_odd = 0 # 盤中零股
)
五檔報價
api.quote.subscribe(api.Contracts.Stocks["2330"],
quote_type = sj.constant.QuoteType.BidAsk, # or 'bidask'
version = sj.constant.QuoteVersion.v1 # or 'v1'
)
# v0
Response Code: 200 | Event Code: 16 | Info: QUT/*/TSE/2330 | Event: Subscribe or Unsubscribe ok
QUT/idcdmzpcr01/TSE/2330
{
'AskPrice': [594.0, 595.0, 596.0, 597.0, 598.0],
'AskVolume': [1465, 532, 507, 92, 258],
'BidPrice': [593.0, 592.0, 591.0, 590.0, 589.0],
'BidVolume': [254, 178, 255, 268, 163],
'Date': '2021/07/01',
'Time': '09:09:48.447219'
}
# v1
Response Code: 200 | Event Code: 16 | Info: QUO/v1/STK/*/TSE/2330 | Event: Subscribe or Unsubscribe ok
Exchange.TSE
BidAsk(
code = '2330',
datetime = datetime.datetime(2021, 7, 1, 9, 9, 54, 36828),
bid_price = [Decimal('593'), Decimal('592'), Decimal('591'), Decimal('590'), Decimal('589')],
bid_volume = [248, 180, 258, 267, 163],
diff_bid_vol = [3, 0, 0, 0, 0], # 買價增減量
ask_price = [Decimal('594'), Decimal('595'), Decimal('596'), Decimal('597'), Decimal('598')],
ask_volume = [1457, 531, 506, 90, 259],
diff_ask_vol = [0, 0, 0, 0, 0], # 賣價增減量
suspend = 0,
simtrade = 0,
intraday_odd = 0
)
知道怎麼抓取股票明細與五檔之後,接下來增加一些技術指標協助分析吧。
技術指標常聽到的有均線 MA 或 相對強弱指數 RSI 指標
其中 RSI 是以某段時間,股價”平均漲幅”與”平均跌幅”所計算出來的數值,可看出股價觀測時間內股票價格強勢或弱勢的指標。
RSI = (上升平均數/(上升平均數+下跌平均數))×100
根據公式我們可以得到下面結論:
RSI的範圍一定在0-100之間。
RSI越大,代表過去『漲的機率』越大。
RSI指標的另個判斷買進訊號或賣出訊號的方式,是利用短週期的RSI波動會較常週期的波動來的劇烈,
『短週期的RSI』向上突破『長週期的RSI』,稱為黃金交叉,是買進訊號。
『短週期的RSI』向下跌破『長週期的RSI』,稱為死亡交叉,為賣出訊號。
明天來實作看看 RSI順勢策略,抓最近14根K棒去做運算,突破70則市價買進,跌破30則市價賣出 策略吧
參考:
現在似乎要把整個文章內容稍微調整一下惹